// util/alert_redis.go
package util

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"time"

	"v2/config"

	"github.com/go-redis/redis"
)

const (
	// Redis 键前缀
	alertVarsKeyPrefix = "alert:vars:"
)

// SaveAlertVariables 保存告警变量到 Redis
func SaveAlertVariables(alertID string, variables map[string]interface{}) error {
	client := GetRedisClient()
	if client == nil {
		return fmt.Errorf("Redis 客户端未初始化")
	}

	ctx := context.Background()

	// 序列化变量
	data, err := json.Marshal(variables)
	if err != nil {
		return fmt.Errorf("序列化告警变量失败: %v", err)
	}

	// 设置过期时间（从配置中获取）
	ttl := time.Duration(config.Global.Redis.AlertVarsTTL) * time.Hour

	// 保存到 Redis
	key := fmt.Sprintf("%s%s", alertVarsKeyPrefix, alertID)
	_, err = client.Set(ctx, key, data, ttl).Result()
	if err != nil {
		return fmt.Errorf("保存告警变量到 Redis 失败: %v", err)
	}

	log.Printf("[Redis] 保存告警变量成功，alertID: %s, TTL: %v", alertID, ttl)
	return nil
}

// GetAlertVariables 从 Redis 获取告警变量
func GetAlertVariables(alertID string) (map[string]interface{}, bool, error) {
	client := GetRedisClient()
	if client == nil {
		return nil, false, fmt.Errorf("Redis 客户端未初始化")
	}

	ctx := context.Background()

	// 获取键
	key := fmt.Sprintf("%s%s", alertVarsKeyPrefix, alertID)

	// 从 Redis 获取
	data, err := client.Get(ctx, key).Result()
	if err == redis.Nil {
		log.Printf("[Redis] 未找到告警变量，alertID: %s", alertID)
		return nil, false, nil // 键不存在
	} else if err != nil {
		return nil, false, fmt.Errorf("从 Redis 获取告警变量失败: %v", err)
	}

	// 反序列化
	var variables map[string]interface{}
	if err := json.Unmarshal([]byte(data), &variables); err != nil {
		return nil, false, fmt.Errorf("反序列化告警变量失败: %v", err)
	}

	log.Printf("[Redis] 获取告警变量成功，alertID: %s", alertID)
	return variables, true, nil
}

// RemoveAlertVariables 从 Redis 移除告警变量
func RemoveAlertVariables(alertID string) error {
	client := GetRedisClient()
	if client == nil {
		return fmt.Errorf("Redis 客户端未初始化")
	}

	ctx := context.Background()

	// 获取键
	key := fmt.Sprintf("%s%s", alertVarsKeyPrefix, alertID)

	// 从 Redis 移除
	_, err := client.Del(ctx, key).Result()
	if err != nil {
		return fmt.Errorf("从 Redis 移除告警变量失败: %v", err)
	}

	log.Printf("[Redis] 移除告警变量成功，alertID: %s", alertID)
	return nil
}
